﻿Imports FairShop.Objects
Imports Microsoft.Win32
Imports System.ComponentModel
Imports System.Data.OleDb
Imports System.IO
Imports System.Xml

Public Class PrintUtility

    Private Shared _bgw As BackgroundWorker

    Public Shared Sub PrintTicket(ByVal lijst As List(Of VerkoopsDetail), _
            ByVal winkelier As String, ByVal teBetalen As Decimal, ByVal betaald As Decimal)

        If (Not Configuratie.TicketAfdrukken) Then Return

        ' asynchrone code
        If (_bgw Is Nothing) Then
            _bgw = New BackgroundWorker() ' afdrukken in de achtergrond laten gebeuren in een aparte thread
            AddHandler _bgw.DoWork, AddressOf PrintTicket_DoWork
        End If

        Dim t As New PrintTicketDocument(lijst, winkelier, teBetalen, betaald)
        _bgw.RunWorkerAsync(t)

        ' synchrone code
        'Dim t As New PrintTicketDocument(lijst, winkelier, teBetalen, betaald)
        't.Print()
    End Sub

    Private Shared Sub PrintTicket_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
        Dim t As PrintTicketDocument = DirectCast(e.Argument, PrintTicketDocument)
        t.Print()
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="verkoop">rij uit verkopentabel met gegevens over de winkelbeurt.
    ''' Via de gerelateerde verkoopsdetailstabel kunnen alle verkoopsdetails afgedrukt worden</param>
    ''' <param name="tellingBeginTabel">lijst met telling bij het begin van de winkelbeurt</param>
    ''' <param name="tellingEindeTabel">lijst met telling bij het einde van de winkelbeurt</param>
    ''' <remarks></remarks>
    Public Shared Sub PrintKasblad(ByVal verkoop As ArtikelsDataSet.VerkopenRow, _
            ByVal tellingBeginTabel As TellingDataSet.LaatsteTellingDataTable, _
            ByVal tellingEindeTabel As TellingDataSet.LaatsteTellingDataTable)

        If (Not Configuratie.KasBladAfdrukken) Then Return

        ' TODO: iets met telling doen
        ' TODO: try/catch?
        Dim t As New PrintKasbladDocument(verkoop)
        t.Print()
    End Sub

    Public Shared Sub PrintKasbladTussendoor(ByVal verkoop As ArtikelsDataSet.VerkopenRow)
        ' If (Not Configuratie.KasBladAfdrukken) Then Return ' Tussendoor altijd afdrukken?
        ' TODO: try/catch?
        PrintKasblad(verkoop, Nothing, Nothing)
    End Sub

    Public Shared Sub PrintLeveringsbon(ByVal idVerkoopLeveringsbon As Integer, ByVal aantalExemplaren As Integer, _
                                        ByVal cashBetaaldZelfsAlsTotaalNietNulIs As Boolean)
        If (idVerkoopLeveringsbon = 0) Then Return
        Dim leveringsbonVerkoop As ArtikelsDataSet.VerkopenRow = Utility.Data.Verkopen.FindById(idVerkoopLeveringsbon)
        If (Not leveringsbonVerkoop.RowState = DataRowState.Unchanged OrElse _
                (From vd In leveringsbonVerkoop.GetVerkoopsDetailsRows _
                Where vd.RowState <> DataRowState.Unchanged).Any) Then
            MsgBox.ShowWarning("De leveringsbon is nog niet bewaard en kan daarom nog niet afgedrukt worden")
            Return
        End If
        Try
            Dim t As New PrintLeveringsbonDocument(leveringsbonVerkoop, cashBetaaldZelfsAlsTotaalNietNulIs)
            For i As Integer = 1 To aantalExemplaren
                t.Print()
            Next
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het afdrukken")
            log.WriteError("PrintUtility.PrintLeveringsbon", ex)
        End Try
    End Sub

    Public Shared Sub PrintVerkoopsrapport(ByVal verkopen As List(Of ArtikelsDataSet.VerkopenRow))
        ' TODO: try/catch?
        Dim t As New PrintVerkoopsrapportDocument(verkopen)
        t.Print()
    End Sub

End Class
